/*
 *  ImageFilePPM.cpp
 *  Ray Tracing
 *
 *  Created by Jean-Marc Comby + Romain Dequesne on Mon May 03 2004.
 *  Copyright (c) 2004. All rights reserved.
 *
 */

#include "ImageFilePPM.hpp"

#include <fstream>

using namespace std;

/**
 * Constructeur permettant d'initialiser une ImageFilePPM de zéro.
 *
 * @param largeur dimension horizontale de l'image.
 * @param hauteur dimension verticale de l'image.
 * @param output nom du fichier dans lequel l'Image sera sauvée.
 */
ImageFilePPM::ImageFilePPM(const unsigned int& largeur,
			   const unsigned int& hauteur,
			   const string& output)
  : ImageFile( largeur, hauteur, output )
{}

/**
 * Construceur permettant d'initialiser une ImageFilePPM à partir
 * d'une Image et un nom de fichier.
 *
 * @param im pointeur sur l'Image que l'on veut sauver.
 * @param output nom du fichier dans lequel l'Image sera sauvée.
 */
ImageFilePPM::ImageFilePPM(Image *im, const string& output)
  : ImageFile( im, output )
{}

/**
 * Le destructeur n'a rien de spécial à faire.
 */
ImageFilePPM::~ImageFilePPM()
{}

/**
 * On ouvre le fichier. Si l'ouverture s'est passée correctement, on
 * écrit "P6" (signifiant que l'on écrit une image en couleur, dans un
 * fichier binaire), puis la largeur et la hauteur de l'image, suivis
 * de la valeur maximale d'une couleur. Ensuite on écrit les 3
 * composantes de chaque pixel, en partant du coin supérieur gauche.
 */
void ImageFilePPM::affiche()
{
  cout << "Sauvegarde de l image " << outputfile << endl;
  ofstream sortie(outputfile, ios::binary); // cree un flux (sortie) en binary
  ComposantCouleur new_line= 0x0a; //code binaire pour une nouvelle ligne
  if (sortie.fail())
    cout <<"Erreur : impossible d ecrire dans le fichier "<< (string)outputfile << endl;
  else
    {
      sortie << "P3 " << Largeur << " " << Hauteur;
      sortie << ' ' << ComposantCouleur::maxComposante();
      sortie << " ";//new_line;
      Couleur color;
      for (unsigned int pixel_y(0); pixel_y < Hauteur; pixel_y++)
	{
	  for (unsigned int pixel_x(0); pixel_x < Largeur; pixel_x++)
	    {
	      color=Screen[pixel_x][pixel_y];
	      sortie << color.rouge() << ' ' << color.vert() << ' ' << color.bleu() << ' ';
	    }
	}
    }
  sortie.close();
}
